查看原文
其他

有效提高视觉模型精度:EfficientNet-Lite 发布

Google TensorFlow 2021-08-05

文 / 软件工程师 Renjie Liu

2019 年 5 月,Google 发布了一系列名为 EfficientNet 的图像分类模型,此类模型在降低一个数量级的参数和算力消耗的情况下,实现了最前沿 (SOTA) 的精度。如果 EfficientNet 可以在边缘设备上运行,则将为计算资源受限的移动和 IoT 设备开拓全新的应用场景。


今天,我们很高兴宣布推出 EfficientNet-Lite (GitHubTFHub),该模型在 TensorFlow Lite 上运行,并已针对 CPU、GPU 和 EdgeTPU 进行性能优化。EfficientNet-Lite 让边缘设备也能利用 EfficientNet 的强大性能,并提供五个不同版本,让用户能够按照自己的需求从低延迟/小模型 (EfficientNet-Lite0) 到高精度 (EfficientNet-Lite4) 之间进行灵活选择。


其中计算量最大的版本,纯整型量化(Integer-Only Quantized EfficientNet-Lite4) 的 EfficientNet-Lite4,在 ImageNet 上可达到 80.4% 的 Top-1 精度,同时可实时运行在 Pixel 4 CPU 30 毫秒/图像)上。下图显示量化 EfficientNet-Lite 模型与目前流行图像分类模型的对应的量化版本的性能对比如下:

在 Pixel 4 CPU 上以四线程运行的纯整形量化模型



挑战:量化与异构硬件

边缘设备的特性也为 EfficientNet 带来了一些挑战。

量化:受限于许多边缘设备对浮点运算的支持,因此需要对模型进行量化处理。但这一过程往往涉及到复杂的量化感知训练过程,或会降低训练后量化模型的准确性。

值得庆幸的是,我们可以利用工具包内的 TensorFlow Lite 训练后量化流程来量化模型,并最大限度避免精度损失。

异构硬件:要想在移动 GPU/EdgeTPU 等多种加速器上运行同样的模型是一项挑战。由于这类硬件的高度定制化,加速器通常只在有限的一些算子中有良好性能表现。我们发现,EfficientNet 中的某些算子并未得到一些加速器的良好支持。

为了解决异构硬件问题,我们对原本的 EfficientNets 进行了如下改进:
  • 删除 Squeeze-and-Excitation 网络,因在这类设备上支持欠佳
  • 用 RELU6 替代所有 swish 激活函数,从而显著提升训练后量化的质量(稍后说明)
  • 放大模型时固定住其 stem 与 head 模块,以减少缩放后模型的大小与计算量



利用 TensorFlow 模型优化工具包进行训练后量化

借助 TensorFlow 模型优化工具包,我们可以通过训练后纯整形量化轻松对模型进行量化,而不会损失太多精度(详情请参阅此处)。这使得模型大小减少为原来的 1/4,推理速度提升 2 倍。


下图显示 EfficientNet-Lite0 浮点模型与量化版本在精度和延迟方面的对比情况:

在四线程 Pixel 4 CPU 上进行基准测试


此外,我们还希望分享一些有关训练后量化的经验。在首次尝试使用训练后量化时,我们发现精度出现大幅度下降:ImageNet 数据集上的 Top-1 精度由 75% 降至 46%。


随后,我们发现精度的大幅下降的原因是量化输出范围过大。量化本质上是将浮点值进行仿射变换到 int8 的值域内。

量化图示


在我们的示例中,输出张量的范围介于 -168 至 204 之间,具体如下图所示:


这表明我们可能损失太多的精度,因为难以将大范围的浮动张量拟合至 int8 域内。


为解决这一问题,我们将 swish 激活函数替换为“范围受限”的激活函数 (RELU6),因为后者将输出范围限制在 [0, 6]。经过这样的改变,量化模型在 ImageNet 上的 Top-1 模型精度从浮点基线74.4% 回升至 75.1%。



立即试用 EfficientNet-Lite

利用 EfficientNet-Lite 的强大性能帮助您处理数据。我们建议您使用 TensorFlow Lite Model Maker,它可在已有 TensorFlow 模型上应用迁移学习,并且您可使用自己的输入数据,以 TensorFlow Lite 格式输出生成的模型。

TensorFlow Lite Model 支持多个模型架构,包括 MobileNetV2 和 EfficientNet-Lite 的所有版本。以下示例说明如何仅用 5 行代码构建 EfficientNet-Lite0 图像分类模型:

# Load your custom dataset
data = ImageClassifierDataLoader.from_folder(flower_path)
train_data, test_data = data.split(0.9)


# Customize the pre-trained TensorFlow model
model = image_classifier.create(train_data, model_spec=efficienetnet_lite0_spec)


# Evaluate the model
loss, accuracy = model.evaluate(test_data)


# Export as TensorFlow Lite model.
model.export('image_classifier.tflite', 'image_labels.txt')


在带有花卉分类的 Colab 上尝试一下。模型切换很简单,只需更改 model_spec 参数。对于 tf_flowers 这样的小数据集,您只需在数分钟内训练 5 个周期即可达到大约 92% 的精度。如果训练更多周期、使用更多数据,或者微调整个模型,则精度还能提升。

接下来,我们用这个模型来构建一个移动应用。您可以从我们的图像分类示例开始,这是使用 EfficientNet-Lite 构建的即时可用的移动应用。该应用会使用 Gradle 任务,将在 ImageNet 数据集上已完成预训练的 EfficientNet-Lite 模型,自动下载到 Assets 目录中。如果您想尝试定制化 Model Maker 创建的模型,可以在 Assets 目录内替换掉该模型。


如屏幕截图所示,EfficientNet-Lite 模型可实时运行推理 (>= 30 fps)。



了解更多信息

构建并运行参考应用(详见说明)。试用 TensorFlow Hub (tfhub.dev) 上的 EfficientNet-Lite,然后使用 TensorFlow Lite Model Maker 针对您的任务定制模型。如需了解 TensorFlow Lite 的更多信息,请访问 tensorflow.google.cn/lite,试用 TensorFlow 模型优化,然后在 tfhub.dev 上探索更多 TensorFlow Lite 模型。



致谢

Renjie Liu、Xunkai Zhang、Tian Lin、Yuqi Li、Mingxing Tan、Khanh LeViet、Chao Mei、Amy Jang、Luiz GUStavo Martins、Yunlu Li、Suharsh Sivakumar、Raziel Alvarez、Lawrence Chan、Jess Kim、Mike Liang、Shuangfeng Li、Sarah Sirajuddin



参考文献

[1]《EfficientNet:卷积神经网络模型缩放的反思》:https://arxiv.org/abs/1905.11946



如果您想详细了解 本文提及 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:

  • EfficientNet
    https://ai.googleblog.com/2019/05/efficientnet-improving-accuracy-and.html

  • GitHub
    https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite

  • TFHub
    https://tfhub.dev/s?q=EfficientNet-Lite

  • TensorFlow Lite 
    https://tensorflow.google.cn/lite

  • TensorFlow Lite 训练后量化流程
    https://tensorflow.google.cn/lite/performance/post_training_quantization

  • TensorFlow 模型优化工具包
    https://tensorflow.google.cn/lite/performance/model_optimization

  • 此处
    https://tensorflow.google.cn/lite/performance/post_training_integer_quant

  • swish 激活函数
    https://arxiv.org/abs/1710.05941

  • TensorFlow Lite Model Maker
    https://github.com/tensorflow/examples/tree/master/tensorflow_examples/lite/model_maker

  • Colab 
    https://colab.sandbox.google.com/github/tensorflow/examples/blob/master/tensorflow_examples/lite/model_maker/demo/image_classification.ipynb

  • tf_flowers 
    https://tensorflow.google.cn/datasets/catalog/tf_flowers

  • 图像分类
    https://tensorflow.google.cn/lite/models/image_classification/overview

  • Gradle 任务
    https://github.com/tensorflow/examples/blob/master/lite/examples/image_classification/android/app/download.gradle

  • 说明
    https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification

  • TensorFlow 模型优化

    https://tensorflow.google.cn/model_optimization



更多 TensorFlow Lite 相关阅读:



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存